#include <Wire.h>

#include <TM1637.h>

#define CLK 3
#define DIO 2

TM1637 tm1637(CLK, DIO);

int vol[18];  //   19.

 //I2C Arduino Library

#define Magnetometer_mX0 0x01  
#define Magnetometer_mX1 0x00  
#define Magnetometer_mZ0 0x05  
#define Magnetometer_mZ1 0x06  
#define Magnetometer_mY0 0x03  
#define Magnetometer_mY1 0x02  
#define Magnetometer_DATARATE_50HZ = 0b01
#define Magnetometer_RANGE_2GA     = 0b00
#define Magnetometer_SAMPLES_1     = 0b00

int mX0, mX1, mX_out;
int mY0, mY1, mY_out;
int mZ0, mZ1, mZ_out;

float Xm,Ym,Zm;

#define Magnetometer 0x0D //I2C 7bit address of HMC5883


void setup(){
  tm1637.init(); // 
  tm1637.set(0); //     0  7
 
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
  delay(100);
 Wire.beginTransmission(Magnetometer) ;
       Wire.write(0x0B) ; //  QMC5883L
       Wire.write(0x01) ;  //   
       Wire.endTransmission() ;
  Wire.beginTransmission(Magnetometer); 
  Wire.write(0x09); // Select mode register
  Wire.write( 0x0D); // Continuous measurement mode
  Wire.endTransmission();
  
    tm1637.display(0, "P ");              //  raf
    tm1637.display(1, 10);
    tm1637.display(2, 15);
    delay(3000);
}

void loop(){
 
  //---- X-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mX1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mX0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mX0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mX1 = Wire.read();
  }

  //---- Y-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mY1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mY0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mY0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mY1 = Wire.read();
  }
  
  //---- Z-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mZ1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mZ0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mZ0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mZ1 = Wire.read();
  }
 
  //---- X-Axis
  mX1=mX1<<8;
  mX_out =mX0+mX1; // Raw data
  // From the datasheet: 330 mG/digit
  Xm = mX_out*0.33; // Gauss unit
  //* Earth magnetic field ranges from 0.25 to 0.65 Gauss, so these are the values that we need to get approximately.

label1:           //      tm1637
    
    for (int i = 0; i <= 14; i++) {
    
   //       -
    vol[i] = (Xm);
    vol[15] = (Xm); 
    delay(66);
    if ( vol[15] > 8900 || vol[15] < -2950 )               //    1900   950
 {   
    tm1637.display(0, 15);                  // FUUL - 
    tm1637.display(1, ">");
    tm1637.display(2, ">");
    tm1637.display(3, "8");
    delay(3000);
    goto label1;
 }
    }
  
    vol[16] = (vol[0]+vol[1]+vol[2]+vol[3]+vol[4]+vol[5]+vol[6]+vol[7])/8;
    vol[17] = (vol[8]+vol[9]+vol[10]+vol[11]+vol[12]+vol[13]+vol[14])/7;
    vol[18] = max(vol[16],vol[17]);
    


    tm1637.display(vol[18]);

    
}

/*! //   
  //---- Y-Axis
  mY1=mY1<<8;
  mY_out =mY0+mY1;
  Ym = mY_out*0.00092;

  //---- Z-Axis
  mZ1=mZ1<<8;
  mZ_out =mZ0+mZ1;
  Zm = mZ_out*0.00092;

 


  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(Xm);
  Serial.print("  y: ");
  Serial.print(Ym);
  Serial.print("  z: ");
  Serial.println(Zm);
  
  delay(50);
}
*/